import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime';
import 'dayjs/locale/zh-cn';

// 加载插件
dayjs.extend(relativeTime);
// 设置语言
dayjs.locale('zh-cn');

type DateFormatType = 'relative' | 'date' | 'full';

/**
 * 格式化日期
 * @param date 日期字符串或时间戳
 * @param type 格式化类型：
 *  - relative: 相对时间（如：刚刚、5分钟前）
 *  - date: 日期（如：2023-12-25）
 *  - full: 完整日期时间（如：2023-12-25 08:30:00）
 * @returns 格式化后的字符串
 */
export function formatDate(
  date: string | number | Date,
  type: DateFormatType = 'relative'
): string {
  const d = dayjs(date);

  // 无效日期
  if (!d.isValid()) {
    return '无效日期';
  }

  switch (type) {
  case 'relative': {
    const now = dayjs();
    const diffMinutes = now.diff(d, 'minute');
    const diffHours = now.diff(d, 'hour');
    const diffDays = now.diff(d, 'day');

    // 小于 1 分钟
    if (diffMinutes < 1) {
      return '刚刚';
    }
    // 小于 1 小时
    if (diffHours < 1) {
      return `${diffMinutes} 分钟前`;
    }
    // 小于 24 小时
    if (diffDays < 1) {
      return `${diffHours} 小时前`;
    }
    // 小于 30 天，显示相对时间
    if (diffDays < 30) {
      return `${diffDays} 天前`;
    }
    // 超过 30 天，显示具体日期
    return d.format('YYYY-MM-DD');
  }

  case 'date':
    return d.format('YYYY-MM-DD');

  case 'full':
    return d.format('YYYY-MM-DD HH:mm:ss');

  default:
    return d.format('YYYY-MM-DD');
  }
}

/**
 * 格式化持续时间
 * @param minutes 分钟数
 * @returns 格式化后的字符串（如：5分钟、1小时20分钟）
 */
export function formatDuration(minutes: number): string {
  if (minutes < 1) {
    return '不到1分钟';
  }

  const hours = Math.floor(minutes / 60);
  const remainingMinutes = minutes % 60;

  if (hours === 0) {
    return `${minutes}分钟`;
  }

  if (remainingMinutes === 0) {
    return `${hours}小时`;
  }

  return `${hours}小时${remainingMinutes}分钟`;
}

/**
 * 获取友好的时间范围描述
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @returns 时间范围描述
 */
export function getDateRange(
  startDate: string | number | Date,
  endDate: string | number | Date
): string {
  const start = dayjs(startDate);
  const end = dayjs(endDate);

  if (!start.isValid() || !end.isValid()) {
    return '无效日期范围';
  }

  // 同一天
  if (start.isSame(end, 'day')) {
    return start.format('YYYY-MM-DD');
  }

  // 同一月
  if (start.isSame(end, 'month')) {
    return `${start.format('YYYY-MM-DD')} 至 ${end.format('DD')}`;
  }

  // 同一年
  if (start.isSame(end, 'year')) {
    return `${start.format('YYYY-MM-DD')} 至 ${end.format('MM-DD')}`;
  }

  // 不同年
  return `${start.format('YYYY-MM-DD')} 至 ${end.format('YYYY-MM-DD')}`;
}

/**
 * 检查日期是否过期
 * @param date 日期
 * @param offsetDays 偏移天数（可选，默认为0）
 * @returns 是否过期
 */
export function isExpired(
  date: string | number | Date,
  offsetDays = 0
): boolean {
  const d = dayjs(date);
  if (!d.isValid()) {
    return false;
  }

  const now = dayjs();
  return d.add(offsetDays, 'day').isBefore(now);
}

/**
 * 格式化日期为完整格式
 * 例如：2024-01-20 15:30:45
 */
export const formatFullDate = (date: string | Date) => {
  return dayjs(date).format('YYYY-MM-DD HH:mm:ss');
};

// 导出 dayjs 实例，以便进行更多自定义操作
export { dayjs };
